package com.guodidi.media.util;

import com.google.common.base.CaseFormat;
import com.guodidi.media.domain.bo.CommonParams;
import com.guodidi.media.domain.bo.HlsParams;
import com.guodidi.media.domain.enums.CovertTypeE;

import java.lang.reflect.Field;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by 郭垚辉 on 2017/7/27.
 */
public class ParamsUtils {

    /**
     * 通过传入的object类，去读取该类中的属性值，读取的顺序和该变量的声明顺序一致
     *
     * @param object     需要进行参数
     * @param paramsList 需要返回的参数list
     */
    private static List<String> convertParams(Object object, List<String> paramsList) {
        try {
            Field[] fields = object.getClass().getDeclaredFields();
            for (Field field : fields) {
                field.setAccessible(true);
                Class<?> type = field.getType();
                if (type.isArray() && (type.getTypeName() instanceof String)) {
                    String[] cs = (String[]) field.get(object);
                    for (String c : cs) {
                        paramsList.add("-" + field.getName());
                        paramsList.add(c);
                    }
                    continue;
                }
                paramsList.add("-" + CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, field.getName()));
                paramsList.add((String) field.get(object));
            }
            return paramsList;
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static List<String> getParams(CovertTypeE type, CommonParams params) {
        List<String> list = new ArrayList<>();
        list.add(params.getTargetExe());
        // 输入文件
        list.add(params.getInputFlag());
        list.add(params.getSourcePath().toString());
        // 音频解码
        list.add(params.getEncodeAudioFlag());
        list.add(params.getEncodeAudio());
        // 视频解码
        list.add(params.getEncodeVideoFlag());
        list.add(params.getEncodeVideo());
        // 设置执行的线程的数目
        list.add(params.getThreadsFlag());
        list.add(params.getThreads());
        // 进行客制化
        switch (type) {
            case HLS:
                HlsParams hlsParams = new HlsParams();
                hlsParams.setHlsBaseUrl(params.getHlsBaseUrl());
                ParamsUtils.convertParams(hlsParams, list);
                // 设置工作目录
                params.addWorkPath(hlsParams.getHlsBaseUrl());
                // 设置sub路径
                params.getTargetHls().setSubPath(Paths.get(hlsParams.getHlsBaseUrl()));
                // 重置目标文件路径 --> 括号中是拼接新的文件名
                params.setVirtualDestPath(params.getWorkPath().resolve(params.getVirtualDestPath().getFileName()));
                break;
            default:
                return null;
        }
        // 设置输出文件的位置
        list.add(params.getVirtualDestPath().toString());
        return list;
    }
}
